FloatingMotion.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. using UnityEngine;
  2. using Random = UnityEngine.Random;
  3. namespace Dustyroom {
  4. public class FloatingMotion : MonoBehaviour {
  5. public float verticalAmplitude = 1.0f;
  6. public float horizontalAmplitude = 0.0f;
  7. [Space]
  8. public float speed = 1.0f;
  9. [Space, Tooltip("In seconds")]
  10. public float startDelay = 0;
  11. [Space]
  12. public bool worldSpace = false;
  13. private Vector3 initialPosition;
  14. private float offsetH = 0f;
  15. private float offsetV = 0f;
  16. private bool isMoving = false;
  17. void Start() {
  18. Invoke("Initialize", startDelay);
  19. }
  20. private void Initialize() {
  21. initialPosition = worldSpace ? transform.position : transform.localPosition;
  22. offsetH = Random.value * 1000f;
  23. offsetV = Random.value * 1000f;
  24. isMoving = true;
  25. }
  26. void Update() {
  27. if (!isMoving) {
  28. return;
  29. }
  30. var hDirection = new Vector3(Mathf.Sin(Time.timeSinceLevelLoad * speed * 0.5f + offsetV + 100f), 0f,
  31. Mathf.Cos(Time.timeSinceLevelLoad * speed + offsetV + 100f));
  32. Vector3 offset = Vector3.up * Mathf.Sin(Time.timeSinceLevelLoad * speed + offsetH) * verticalAmplitude +
  33. hDirection * Mathf.Sin(Time.timeSinceLevelLoad * speed + offsetV) * horizontalAmplitude;
  34. Vector3 position = initialPosition + offset * Time.timeScale;
  35. if (worldSpace) {
  36. transform.position = position;
  37. } else {
  38. transform.localPosition = position;
  39. }
  40. }
  41. }
  42. }